﻿using Caliburn.Micro;
using Phones.Client.Model;
using Phones.Client.Repository;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace Phones.Client.ViewModel
{
    [Export(typeof(MainViewModel))]
    public class MainViewModel : Screen
    {
        readonly IWindowManager _windowManager;
        private readonly ObservableCollection<RootTreeNodeViewModel> _rootNodes =
            new ObservableCollection<RootTreeNodeViewModel>();
        private object _selectedNodeObject = null;

        [ImportingConstructor]
        public MainViewModel(IWindowManager windowManager)
        {
            _windowManager = windowManager;
            _rootNodes.Add(new RootTreeNodeViewModel(_windowManager));
            base.DisplayName = "Редактор телефонной книги";
        }

        public ObservableCollection<RootTreeNodeViewModel> RootNodes
        {
            get { return _rootNodes; }
        }

        public object SelectedNodeObject
        {
            get { return _selectedNodeObject; }
            set
            {
                _selectedNodeObject = value;
                NotifyOfPropertyChange(() => SelectedNodeObject);
            }
        }

        public void ChangeSelectedNodeModel(object param)
        {
            // Этот Action обрабатывает событие TreeView.SelectedItemChanged,
            // в качестве параметра получает аргументы события (см. xaml),
            // получаем аргументы события распаковкой:
            var e = param as System.Windows.RoutedPropertyChangedEventArgs<object>;
            if (e == null)
            {
                // если не удалось получить - сбрасываем выделенный объект
                SelectedNodeObject = null;
            }
            else
            {
                // если все ОК - используем аргументы так же, как в событии
                SetSelectedNodeObject(e.NewValue);
            }
        }

        #region Actions block
        public void AddEmployee()
        {
            var result =
                _windowManager.ShowDialog(new EmployeePropertiesViewModel());
        }

        public bool CanAddEmployee()
        {
            return true;
        }

        public void Reload(object sender)
        {
            var vm = sender as ServiceNodeTreeNodeViewModel;
        } 
        #endregion

        /// <summary>
        /// Получает модель узла дерева по его представлению
        /// </summary>
        /// <param name="nodeVM"></param>
        private void SetSelectedNodeObject(object nodeVM)
        {
            //var serviceZoneNodeVM = nodeVM as ServiceNodeTreeNodeViewModel;
            //if (serviceZoneNodeVM != null)
            //{
            //    //SelectedNodeObject = serviceZoneNodeVM.Model;
            //    SelectedNodeObject = nodeVM;
            //    return;
            //}
            //var organisationNodeVM = nodeVM as OrganisationTreeNodeViewModel;
            //if (organisationNodeVM != null)
            //{
            //    SelectedNodeObject = organisationNodeVM.Model;
            //    return;
            //}
            //var departmentNodeVM = nodeVM as DepartnemtTreeNodeViewModel;
            //if (departmentNodeVM != null)
            //{
            //    SelectedNodeObject = departmentNodeVM.Model;
            //    return;
            //}
            //var contactNodeVM = nodeVM as ContactTreeNodeViewModel;
            //if (contactNodeVM != null)
            //{
            //    SelectedNodeObject = contactNodeVM.Model;
            //    return;
            //}
            //SelectedNodeObject = null;
            SelectedNodeObject = nodeVM;
        }
    }
}
